<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:doc="livcos.org/ns/doc"
	xmlns="http://www.w3.org/1999/XSL/Format"
	exclude-result-prefixes="doc">

	<xsl:template match="doc:markup">
		<block margin-left="0.4cm" font-size="6pt" margin-top="0pt" margin-bottom="0pt">
			<xsl:apply-templates select="node()" mode="markup"/>
		</block>
	</xsl:template>

	<!-- basic elements -->
	<xsl:template match="*" mode="markup">
		<block margin-left="0.9cm" color="blue" text-indent="-0.6cm">
			<xsl:text><![CDATA[<]]></xsl:text>
			<xsl:value-of select="name(.)"/>
			<xsl:apply-templates select="@*" mode="markup"/>
			<xsl:call-template name="namespace_markup"/>
			<xsl:text><![CDATA[>]]></xsl:text>
		</block>
		<block margin-left="0.3cm">
			<xsl:apply-templates select="node()" mode="markup"/>
		</block>
		<block margin-left="0.3cm" color="blue">
			<xsl:text><![CDATA[<]]>/</xsl:text>
			<xsl:value-of select="name(.)"/>
			<xsl:text><![CDATA[>]]></xsl:text>
		</block>
	</xsl:template>

	<!-- elements with direct text children -->
	<xsl:template match="*[text()[normalize-space(.) != '']]" mode="markup">
		<block margin-left="0.9cm" color="blue" text-indent="-0.6cm">
			<xsl:text><![CDATA[<]]></xsl:text>
			<xsl:value-of select="name(.)"/>
			<xsl:apply-templates select="@*" mode="markup"/>
			<xsl:call-template name="namespace_markup"/>
			<xsl:text><![CDATA[>]]></xsl:text>
			<xsl:apply-templates select="node()" mode="markup"/>
			<xsl:text><![CDATA[<]]>/</xsl:text>
			<xsl:value-of select="name(.)"/>
			<xsl:text><![CDATA[>]]></xsl:text>
		</block>
	</xsl:template>

	<!-- empty elements -->
	<xsl:template match="*[count(node()) &lt; 1]" mode="markup">
		<xsl:choose>
			<xsl:when test="../text()[normalize-space(.) != '']">
				<inline color="blue">
					<xsl:call-template name="print_emptyElement"/>
				</inline>
			</xsl:when>
			<xsl:otherwise>
				<block margin-left="0.9cm" color="blue" text-indent="-0.6cm">
					<xsl:call-template name="print_emptyElement"/>
				</block>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<xsl:template name="print_emptyElement">
		<xsl:text><![CDATA[<]]></xsl:text>
		<xsl:value-of select="name(.)"/>
		<xsl:apply-templates select="@*" mode="markup"/>
		<xsl:call-template name="namespace_markup"/>
		<xsl:text>/<![CDATA[>]]></xsl:text>
	</xsl:template>

	<!-- attributes -->
	<xsl:template match="@*" mode="markup">
		<xsl:text> </xsl:text>
		<inline color="green">
			<xsl:value-of select="name(.)"/>
		</inline>
		<xsl:text>=</xsl:text>
		<inline color="black">
			<xsl:text>"</xsl:text>
			<xsl:value-of select="."/>
			<xsl:text>"</xsl:text>
		</inline>
	</xsl:template>

	<!-- namespaces -->
	<xsl:template name="namespace_markup">
		<xsl:variable name="e" select="."/>
		<xsl:for-each select="namespace::*[name(.) != 'xml']">
			<xsl:variable name="n" select="name(.)"/>
			<xsl:if test="not($e/ancestor::*[namespace::*[name(.) = $n]])">
				<xsl:text> </xsl:text>
				<inline color="green">
					<xsl:text>xmlns:</xsl:text>
					<xsl:value-of select="name(.)"/>
				</inline>
				<xsl:text>=</xsl:text>
				<inline color="black">
					<xsl:text>"</xsl:text>
					<xsl:value-of select="."/>
					<xsl:text>"</xsl:text>
				</inline>
			</xsl:if>
		</xsl:for-each>
	</xsl:template>

	<!-- comments -->
	<xsl:template match="comment()" mode="markup">
		<block margin-left="0.3cm" color="grey">
			<xsl:text><![CDATA[<]]>!--</xsl:text>
			<xsl:value-of select="."/>
			<xsl:text>--<![CDATA[>]]></xsl:text>
		</block>
	</xsl:template>

	<!-- text -->
	<xsl:template match="text()" mode="markup">
		<inline color="black">
			<xsl:value-of select="normalize-space(.)"/>
		</inline>
	</xsl:template>

	<!-- processing instructions -->
	<xsl:template match="processing-instruction()" mode="markup">
		<block margin-left="0.3cm" color="darkgrey">
			<xsl:text><![CDATA[<]]>?xml</xsl:text>
			<xsl:value-of select="."/>
			<xsl:text>?<![CDATA[>]]></xsl:text>
		</block>
	</xsl:template>

</xsl:stylesheet>
